// package org.dromara.common.vcp.service.impl;
//
// import cn.hutool.core.collection.CollUtil;
// import cn.hutool.core.util.ObjUtil;
// import cn.hutool.core.util.StrUtil;
// import cn.hutool.json.JSONArray;
// import cn.hutool.json.JSONObject;
// import cn.hutool.json.JSONUtil;
// import jakarta.annotation.Resource;
// import lombok.extern.log4j.Log4j2;
// import org.dromara.common.core.exception.ServiceException;
// import org.dromara.common.core.utils.StreamUtils;
// import org.dromara.common.redis.utils.RedisUtils;
// import org.dromara.common.vcp.domain.SzSecret;
// import org.dromara.common.vcp.service.SzApiService;
// import org.dromara.common.vcp.utils.ByteFormat;
// import org.dromara.common.vcp.utils.GenReqParam;
// import org.dromara.common.vcp.utils.OkHttpUtil;
// import org.dromara.common.vcp.utils.XXTea;
// import org.springframework.stereotype.Service;
//
// import java.time.Duration;
// import java.util.*;
// import java.util.stream.Collectors;
//
// @Log4j2
// @Service
// public class SzApiServiceImpl implements SzApiService {
//
//     private final String AI_URL = "https://21cn.vcp.com";
//
//     @Resource
//     private SzSecretService szSecretService;
//
//     @Override
//     public String getLiveUri(String deviceCode, String params) {
//         try {
//
//             SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//
//             int mediaType = 0;
//             int proto = 1;
//             if (StrUtil.isNotBlank(params)) {
//                 JSONObject jsonObject = JSONUtil.parseObj(params);
//                 mediaType = null == jsonObject.get("mediaType") ? mediaType : jsonObject.getInt("mediaType", 0);
//                 proto = null == jsonObject.get("proto") ? proto : jsonObject.getInt("proto", 1);
//             }
//             // 接口定义具体入参
//             Map<String, Object> map = new HashMap<>();
//             map.put("deviceCode", deviceCode);
//             // 直播类型（1.标清；0.高清）
//             map.put("mediaType", mediaType);
//
//             String url;
//             if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                 url = AI_URL + "/open/u/cloud/getDeviceMediaUrl";
//                 // 直播地址类型(1.rtsp；3.hls) 默认为 1
//                 map.put("proto", proto);
//             } else {
//                 if (3 == proto) { // hls
//                     url = AI_URL + "/open/token/cloud/getDeviceMediaUrlHls";
//                 } else { // rtsp
//                     url = AI_URL + "/open/token/cloud/getDeviceMediaUrlRtsp";
//                 }
//                 // 静音标识（0.非静音;1.静音）
//                 map.put("mute", 1);
//                 // 企业主(访问令牌获取方式为“用户无感知获取令牌”，需要传此参数)
//                 map.put("enterpriseUser", szSecret.getPhone());
//                 map.put("accessToken", getToken(szSecret));
//             }
//
//             String s = sendMessage(url, map, szSecret);
//             log.info("摄像头获取流的访问地址：{}, 设备流结果: {}", AI_URL, s);
//             JSONObject parse = JSONUtil.parseObj(s);
//             if (0 != parse.getInt("code", 1)) {
//                 log.info("获取结果错误！{}", s);
//                 return "";
//             }
//             String data = parse.getStr("data");
//             return parseData(data, szSecret);
//         } catch (Exception e) {
//             e.printStackTrace();
//             throw new ServiceException("设备：【" + deviceCode + "】获取视频流失败 ! 原因" + e.getMessage());
//         }
//     }
//
//     @Override
//     public String queryDeviceImageData(String phone, String deviceCode, String startTime, String endTime, String imageType, String imageTypeGroup, Integer size) {
//         try {
//             SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//
//             // 接口定义具体入参
//             Map<String, Object> map = new HashMap<>();
//             // szSecret 里面要包含手机号码
//             map.put("phone", szSecret.getPhone());
//             map.put("deviceCode", deviceCode);
//             map.put("startTime", startTime);
//             map.put("endTime", endTime);
//             map.put("imageType", imageType);
//             if (size != null) {
//                 map.put("size", size);
//             }
//             map.put("imageTypeGroup", imageTypeGroup);
//             map.put("requestId", UUID.randomUUID().toString());
//
//             String url;
//             if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                 url = AI_URL + "/open/u/aiImage/queryDeviceImageData";
//             } else {
//                 url = AI_URL + "/open/token/aiImage/queryDeviceImageData";
//                 map.put("enterpriseUser", szSecret.getPhone());
//                 map.put("accessToken", getToken(szSecret));
//             }
//
//             String s = sendMessage(url, map, szSecret);
//             log.info("调用云眼获取图片信息;deviceCode:{};result:{}", deviceCode, s);
//             if (!JSONUtil.isTypeJSON(s)) {
//                 return null;
//             }
//             JSONObject parse = JSONUtil.parseObj(s);
//             if (0 != parse.getInt("code", 1)) {
//                 return null;
//             }
//             return s;
//         } catch (Exception e) {
//             log.error("调用云眼获取图片信息异常;deviceCode:{};e:{}", deviceCode, e.getMessage());
//         }
//         return "";
//     }
//
//     @Override
//     public String subscribe(String deviceCode, String callBackUrl, String alertType) {
//         SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//
//         Map<String, Object> map = new HashMap<>();
//         map.put("deviceCode", deviceCode);
//         map.put("callbackUrl", callBackUrl);
//         map.put("alertTypes", alertType);
//         try {
//             String url;
//             if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                 url = AI_URL + "/open/u/message/device/subscribe";
//             } else {
//                 url = AI_URL + "/open/token/message/device/subscribe";
//                 map.put("accessToken", getToken(szSecret));
//                 map.put("enterpriseUser", szSecret.getPhone());
//             }
//             String s = sendMessage(url, map, szSecret);
//             log.info("调用订阅接口；req:{}, result:{}", map, s);
//             return s;
//         } catch (Exception e) {
//             log.error("调用云眼订阅AI消息异常;req:{};e:{}", map, e.getMessage());
//             return null;
//         }
//     }
//
//     @Override
//     public String unsubscribe(String deviceCode, String alertType) {
//         SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//
//         Map<String, Object> map = new HashMap<>();
//         map.put("deviceCode", deviceCode);
//         map.put("alertTypes", alertType);
//         try {
//
//             String url;
//             if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                 url = AI_URL + "/open/u/message/device/unsubscribe";
//             } else {
//                 url = AI_URL + "/open/token/message/device/unsubscribe";
//                 map.put("accessToken", getToken(szSecret));
//                 map.put("enterpriseUser", szSecret.getPhone());
//             }
//             String s = sendMessage(url, map, szSecret);
//             log.info("调用退订接口；req:{}, result:{}", map, s);
//             return s;
//         } catch (Exception e) {
//             log.error("调用云眼取消订阅AI消息异常;req:{};e:{}", map, e.getMessage());
//             return null;
//         }
//     }
//
//     @Override
//     public List<Map<String, Object>> getDeviceStatus(String deviceCodes) {
//         String[] deviceCodeList = deviceCodes.split(",");
//         List<SzSecret> secretList = CollUtil.newArrayList();
//         for (String deviceCode : deviceCodeList) {
//             SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//             secretList.add(szSecret);
//         }
//         // 同一个密钥分组，避免多个appId多次请求token
//         Map<String, List<SzSecret>> appIdList = StreamUtils.groupByKey(secretList, SzSecret::getAppId);
//         Map<SzSecret, String> list = new HashMap<>();
//         appIdList.forEach((appId, szSecretList) -> list.put(szSecretList.get(0), szSecretList.stream()
//                 .map(SzSecret::getDeviceSn)
//                 .collect(Collectors.joining(","))));
//
//         List<Map<String, Object>> resultList = new ArrayList<>();
//
//         list.forEach((szSecret, codes) -> {
//             try {
//                 Map<String, Object> map = new HashMap<>();
//                 map.put("deviceCodes", codes);
//
//                 String url;
//                 if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                     url = AI_URL + "/open/u/device/batchDeviceStatus";
//                 } else {
//                     url = AI_URL + "/open/token/device/batchDeviceStatus";
//                     map.put("accessToken", getToken(szSecret));
//                 }
//
//                 String result = sendMessage(url, map, szSecret);
//
//                 JSONObject jsonObject = JSONUtil.parseObj(result);
//                 int code = jsonObject.getInt("code", 1);
//                 if (0 == code) {
//                     JSONArray dataList = jsonObject.getJSONArray("data");
//                     for (Object object : dataList) {
//                         JSONObject json = (JSONObject) object;
//                         Map<String, Object> resultMap = new HashMap<>();
//                         resultMap.put("deviceCode", json.getStr("deviceCode"));
//                         resultMap.put("status", json.getStr("status"));
//                         resultList.add(resultMap);
//                     }
//                 }
//             } catch (Exception e) {
//                 throw new ServiceException("调用云眼接口：查询设备状态失败！");
//             }
//
//         });
//
//         return resultList;
//
//     }
//
//     public String getAlertInfoDetail(String deviceCode, String msgId, Integer alertType) {
//         SzSecret szSecret = getSecretByDeviceCode(deviceCode);
//         Map<String, Object> map = new HashMap<>();
//         map.put("deviceCode", deviceCode);
//         map.put("msgId", msgId);
//         map.put("alertType", alertType);
//         try {
//             String url;
//             if (SzSecret.API_ONE_VERSION.equals(szSecret.getApiVersion())) {
//                 url = AI_URL + "/open/u/AIAlarm/getAlertInfoDetail";
//             } else {
//                 url = AI_URL + "/open/token/AIAlarm/getAlertInfoDetail";
//                 map.put("accessToken", getToken(szSecret));
//                 map.put("enterpriseUser", szSecret.getPhone());
//             }
//
//             return sendMessage(url, map, szSecret);
//         } catch (Exception e) {
//             log.error("调用云眼查询设备状态消息异常;req:{};e:{}", map, e.getMessage());
//             return null;
//         }
//     }
//
//
//
//     /**
//      * 发送请求
//      *
//      * @param url url
//      * @param map 接口入参
//      */
//     private String sendMessage(String url, Map<String, Object> map, SzSecret szSecret) throws Exception {
//         Map<String, Object> resultMap = GenReqParam.apiGen(map, szSecret);
//         return OkHttpUtil.sendPost(url, resultMap, szSecret.getApiVersion());
//     }
//
//     /**
//      * 通过设备code查询密钥
//      */
//     private SzSecret getSecretByDeviceCode(String deviceCode) {
//         String key = "secret:" + deviceCode;
//         SzSecret szSecret = RedisUtils.getCacheObject(key);
//         if (ObjUtil.isNotNull(szSecret)) {
//             return szSecret;
//         }
//         List<SzSecret> list = szSecretService.list(new LambdaQueryWrapper<SzSecret>().eq(SzSecret::getDeviceSn, deviceCode));
//         if (CollUtil.isEmpty(list)) {
//             throw new ServiceException("设备：【" + deviceCode + "】不存在");
//         }
//
//         szSecret = list.get(0);
//         // 缓存一天的时间
//         RedisUtils.setCacheObject(key, szSecret, Duration.ofDays(1L));
//         return szSecret;
//
//     }
//
//
//     /**
//      * 解析视频流地址
//      */
//     private String parseData(String data, SzSecret szSecret) throws Exception {
//         String decrypt = XXTea.decrypt(data, "UTF-8", ByteFormat.toHex(szSecret.getAppSecret().getBytes()));
//         JSONObject parse = JSONUtil.parseObj(decrypt);
//         return null == parse.get("url") ? "" : parse.getStr("url");
//     }
//
//
//     private String getToken(SzSecret szSecret) throws Exception {
//         String key = "sz:appId:" + szSecret.getAppId();
//         if (RedisUtils.hasKey(key)) {
//             return RedisUtils.getCacheObject(key);
//         }
//         Map<String, Object> params = new HashMap<>();
//         params.put("grantType", "vcp_189");
//         String resultToken = sendMessage(AI_URL + "/open/oauth/getAccessToken", params, szSecret);
//         JSONObject json = JSONUtil.parseObj(resultToken);
//         if (json.getInt("code", 1) != 0) {
//             throw new ServiceException("获取云眼token失败" + resultToken);
//         }
//         String token = json.getJSONObject("data").getStr("accessToken");
//         // 缓存6天 官方说token有效期7天： https://vcp.dlife.cn/portal/document-detail?group=1665564929510465537
//         RedisUtils.setCacheObject(key, token, Duration.ofDays(6L));
//
//         return token;
//     }
//
//
// }
